package com.guardchina.framework.util.utils;

import com.guardchina.framework.util.constant.Constants;
import com.guardchina.framework.util.exception.BusinessException;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Calendar;
import java.util.Date;

/**
 * 描述：日期工具类
 *
 * @author lwb
 * @date 2019/3/25 9:51
 */
public class DateUtil {

    private final static DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_PATTERN);

    /**
     * 获取指定日期的开始时间
     * @param localDate 指定的日期
     * @return 指定日期的开始时间
     */
    public static LocalDateTime startTime(LocalDate localDate){
        LocalTime startTime = LocalTime.of(0,0,0,0);
        return LocalDateTime.of(localDate, startTime);
    }

    /**
     * 获取指定日期日期的结束时间
     * example current date 2019-03-25 return 2019-03-25 23:59:59.999999999
     * @return 指定日期日期的结束时间
     */
    public static LocalDateTime endTime(LocalDate localDate){
        LocalTime endTime = LocalTime.of(23,59,59,999999999);
        return LocalDateTime.of(localDate, endTime);
    }

    /**
     * 获取当前时间格式
     * @return String
     */
    public static String getSeqString() {
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        return LocalDateTime.now().format(format);
    }

    /**
     * 获得今天最后一秒时间
     * @return Date
     */
    public static Date todayFinally() {
        LocalDateTime time = LocalDateTime.now();
        time = time.withHour(23);
        time = time.withMinute(59);
        time = time.withSecond(59);
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zdt = time.atZone(zoneId);
        return Date.from(zdt.toInstant());
    }

    /**
     * 验证日期格式
     * @param strDate 日期字符串
     * @return 是否是日期
     */
    public static boolean isValidDate(String strDate) {
        try {
            TIME_FORMAT.parse(strDate);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }

    /**
     * 获取今日日期字符串
     * @param pattern 日期格式
     * @return String
     */
    public static String getToday(String pattern){
        DateTimeFormatter format = DateTimeFormatter.ofPattern(pattern);
        return LocalDateTime.now().format(format);
    }

    /**
     * 字符串转时间
     * @param dateTime 时间字符串
     * @param pattern 格式
     * @return 时间
     */
    public static LocalDateTime getLocalDateTime(String dateTime, String pattern){
        DateTimeFormatter format = DateTimeFormatter.ofPattern(pattern);
        return LocalDateTime.parse(dateTime, format);
    }

    /**
     * 字符串转时间，使用默认格式
     * @param dateTime 时间字符串
     * @return 时间
     */
    public static LocalDateTime getLocalDateTime(String dateTime){
        return getLocalDateTime(dateTime, Constants.DEFAULT_DATE_TIME_PATTERN);
    }

    /**
     * 获取两个日期的时间间隔
     * @param beginDateStr 开始时间
     * @param endDateStr 结束时间
     * @return 间隔天数
     */
    public static int betweenDays(String beginDateStr, String endDateStr){
        DateFormat df = new SimpleDateFormat(Constants.DEFAULT_DATE_PATTERN);

        try {
            Long beginDate = df.parse(beginDateStr).getTime();
            Long endDate = df.parse(endDateStr).getTime();
            Long days = (endDate - beginDate) / (1000 * 60 * 60 * 24);
            return days.intValue();
        } catch (ParseException e) {
            throw new BusinessException("日期格式不正确");
        }
    }

    /**
     * 日期字符串转日期 默认的格式
     * @param date 日期字符串
     * @return 日期
     */
    public static LocalDate getLocalDate(String date){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_PATTERN);
        return LocalDate.parse(date, formatter);
    }

    /**
     * 时间字符串转时间 默认格式
     * @param time 时间字符串
     * @return 时间
     */
    public static LocalTime getLocalTime(String time){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_PATTERN);
        return LocalTime.parse(time, formatter);
    }

    /**
     * 加上指定的秒数
     * @param date 日期
     * @param seconds 秒数
     * @return 日期
     */
    public static Date plusSeconds(Date date, long seconds){

        long originMilliseconds = date.getTime();

        Date resultDate = new Date();

        resultDate.setTime(originMilliseconds + seconds * 1000);

        return resultDate;
    }

    public static Date localDateTimeToDate(LocalDateTime localDateTime){
        ZoneId zoneId = ZoneId.systemDefault();

        ZonedDateTime zdt = localDateTime.atZone(zoneId);

        return Date.from(zdt.toInstant());
    }

    /**
     * 日期转String
     * @param localDateTime 日期
     * @return String yyyy-MM-dd hh:mm:ss
     */
    public static String fromLocalDateTime(LocalDateTime localDateTime){
        return fromLocalDateTime(localDateTime, Constants.DEFAULT_DATE_TIME_PATTERN);
    }

    /**
     * 日期转String
     * @param localDateTime 日期
     * @param pattern 格式
     * @return String yyyy-MM-dd hh:mm:ss
     */
    public static String fromLocalDateTime(LocalDateTime localDateTime, String pattern){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return formatter.format(localDateTime);
    }

    /**
     * 日期转String
     * @param localDate 日期
     * @return yyyy-MM-dd
     */
    public static String fromLocalDate(LocalDate localDate){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_PATTERN);
        return formatter.format(localDate);
    }

    public static String getYYYYMMDD(LocalDate localDate){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(Constants.YYYYMMDD);
        return formatter.format(localDate);
    }
    public static String getStringDateShort(Date date) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            String dateString = formatter.format(date);
           return dateString;
        }
    /**
     * 得到几天后的时间
     *

     * @param day
     * @return
     */
    public static String getDateAfter(String time, int day) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date d = null;
        Calendar now = Calendar.getInstance();
        try {
            d = format.parse(time);
            now.setTime(d);
        } catch (ParseException e) {
           throw new BusinessException("日期格式转换错误");
        }
        now.set(Calendar.DATE, now.get(Calendar.DATE) + day);//+后 -前
        return getStringDateShort(now.getTime());

    }

    public static void main(String[] args) {
        String after = DateUtil.getDateAfter("2020-07-17", 1);
        System.out.println("得到的日期"+after);
    }

}
